服务网关与身份鉴权
服务网关与身份鉴权是现代微服务架构中保证安全、路由转发、用户身份控制的核心组件。
🧭 什么是服务网关(API Gateway)?
服务网关是客户端与后端服务之间的中间层,用于:
- 请求路由
- 用户身份认证与权限校验
- 限流与熔断
- 日志收集与审计
- 跨域处理
常见网关选型
网关 | 技术栈 | 特点 |
---|---|---|
Nginx | C | 高性能、可扩展 |
Kong | 基于 Nginx + Lua | 插件丰富、支持 JWT/OAuth |
Spring Cloud Gateway | Java | 与 Spring 微服务深度集成 |
AWS API Gateway | 云原生 | 云服务集成好、可视化 |
Traefik | Go | 云原生友好、自动发现 |
🔐 身份认证与鉴权
类型 | 作用 | 示例 |
---|---|---|
认证(Authentication) | 验证“你是谁” | 登录校验 |
鉴权(Authorization) | 判断“你是否有权限做某事” | 是否能访问 /admin 接口 |
常见方式
方式 | 场景 | 描述 |
---|---|---|
Cookie + Session | 单体系统 | 服务端存储状态 |
Token(JWT) | 前后端分离 | 客户端持有,服务端无状态 |
OAuth2 / OIDC | 第三方登录、企业系统 | 标准化认证授权 |
API Key | 内部接口调用 | 静态密钥识别 |
🧑💻 实战代码示例
✅ Nginx 网关配置
server {
listen 80;
server_name api.example.com;
location /auth/ {
proxy_pass http://auth-service;
}
location /user/ {
proxy_pass http://user-service;
}
}
✅ Node.js JWT 鉴权中间件
const jwt = require("jsonwebtoken");
function authMiddleware(req, res, next) {
const token = req.headers.authorization?.split(" ")[1];
if (!token) return res.sendStatus(401);
try {
const payload = jwt.verify(token, "SECRET_KEY");
req.user = payload;
next();
} catch (err) {
res.sendStatus(403);
}
}
✅ JWT 签发示例
const token = jwt.sign({ userId: 123, role: "admin" }, "SECRET_KEY", { expiresIn: "1h" });
res.json({ token });
✅ Spring Cloud Gateway 配置
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_service", r -> r.path("/user/**")
.filters(f -> f.filter(new JwtAuthFilter()))
.uri("lb://user-service"))
.build();
}
🎯 应用场景推荐
场景 | 推荐网关 | 鉴权机制 |
---|---|---|
Web 前后端分离 | Nginx + JWT | Token |
Spring 微服务系统 | Spring Gateway + JWT/OAuth2 | JWT |
多租户 SaaS 接口开放 | Kong + OAuth2 插件 | OAuth2 |
云上无服务器架构 | AWS API Gateway + Cognito | OIDC |
🧠 常见问题
JWT 认证如何防止被篡改?
JWT 使用签名算法(如 HS256)对 payload 进行签名。验证时用相同秘钥校验签名是否一致。
Token 如何失效?
可以设置 expiresIn
到期时间,或使用 Redis 存储黑名单进行主动吊销。
为什么网关推荐做鉴权?
统一入口统一校验,防止重复实现;对外隐藏内部微服务架构。